package com.njust.bean;

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class IOCTest2 {

    //带有关闭容器方法的ioc，实验十使用
    private ConfigurableApplicationContext ioc;

    @Before
    public void tearUp(){
        System.out.println("执行前");
        ioc = new ClassPathXmlApplicationContext("config/ioc2.xml");
    }
    /**
     * 实验10：创建带有生命周期方法的bean
     * Spring容器创建Book对象是会调用Book类的生命周期方法myInit和myDestroy
     * myInit和myDestroy方法需要在配置文件中注册
     *
     *单例： Bean的生命周期
     * 		（容器启动）构造器---->初始化方法---->(容器关闭)销毁方法
     *多实例：
     *		获取bean（构造器--->初始化方法）--->容器关闭不会调用bean的销毁方法
     *
     */
    @Test
    public void test10(){
        System.out.println("========实验十==========");
        //单实例
        Object book03 = ioc.getBean("book03");
        System.out.println("book03 = " + book03);
        //多实例
        Object book04 = ioc.getBean("book04");
        System.out.println("book04 = " + book04);
        System.out.println("spring容器关闭了");
        ioc.close();
        System.out.println("========结束==========");
    }

    /**
     * 实验11：测试bean的后置处理器
     * MyBeanPostProcessor实现了BeanPostProcessor接口
     * 后置处理器：
     *		（容器启动）构造器------后置处理器before..-----初始化方法-----后置处理器after...-----bean初始化完成
     *
     * 无论bean是否有初始化方法；后置处理器都会默认其有，还会继续工作；
     */
    @Test
    public void test11(){
        System.out.println("========实验十一==========");
        Object car03 = ioc.getBean("car03");
        System.out.println("car03 = " + car03);
        ioc.close();
        System.out.println("========结束==========");
    }
}
